home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ansi / pcmous13.zip / PCMOUSE.ASM < prev    next >
Assembly Source File  |  1994-03-14  |  31KB  |  1,278 lines

  1.  
  2. comment *
  3.  
  4.  
  5.   PCMOUSE  (c) 1992,1994 by Jürgen G. Weber
  6.                          Wiesentalstraße 1
  7.                          D-74523 Schwäbisch Hall
  8.                          Germany - European Union
  9.  
  10.   ALL RIGHTS RESERVED
  11.  
  12.   CUT and PASTE in Dos Text Mode
  13.  
  14.   Function: Select text while left button is pressed. As soon as
  15.             button is released the selected text is copied from
  16.             screen into internal buffer. Buffer is cleared not
  17.             until the the next selection, but that is also if a
  18.             screen area is only clicked at and nothing selected.
  19.  
  20.   MAKE:     tasm pcmouse
  21.             tlink pcmouse
  22.  
  23. *
  24.  
  25. XT equ 0               ; set this to TRUE if you want PCMOUSE to run 
  26.              ; on an old PC
  27.  
  28. TRUE equ -1
  29. FALSE equ not TRUE
  30. DE_INSTALL equ 2
  31. ACTIVATE equ 3
  32. TICK_TOO equ 4
  33.  
  34. NOT_INSTALLED equ 40h
  35. ALL_OK equ 41h
  36. WRO_VEC equ 42h
  37.  
  38. PVERSION equ '1.3'
  39. TIMER_TOO equ TRUE   ; decides if at every timer tick
  40.                      ; the keyboard buffer is fed
  41.                      ; but only if also /T
  42.  
  43. if not XT
  44.  .286  ; the times, they're a-changing ...  memento mori 808[6|8]
  45. endif
  46.  
  47. locals                       ; makes the local @@Label possible
  48.  
  49. MOUSE_FN equ 80h             ; new function of int 16h, that tells, if
  50.                              ; the program is already installed
  51. INST_HND equ 67h             ; tell int 16 to reinstall mouse handler
  52.  
  53. IDENTCODE equ 41751          ; anything, e.g. my phone number
  54.  
  55. ; the bufleng is enough for half of a screen, but often is enough
  56. ; for more as blanks are compressed
  57.  
  58. RD_BUFLEN EQU 1024
  59.  
  60. ; Masks for mouse events
  61.  
  62. M_MOVED EQU 1
  63. M_LT_PRESSED EQU 10B
  64. M_LT_RELEASD EQU 100B
  65. M_RT_PRESSED EQU 1000B
  66. M_RT_RELEASD EQU 10000B
  67.  
  68.  
  69. ; mask to XOR the selected screen area with to display it
  70.  
  71. DEFAULT_SCR_MARK_MASK EQU 01010000b
  72.  
  73. ; maximal time between the clicks of a mouse double click
  74. ; in timer ticks
  75.  
  76. DCLCK_SPEED equ 9
  77.  
  78. ; the following macros make the listing better readable
  79.  
  80. show_mouse macro
  81.     push ax
  82.     mov ax,1 ; show mouse
  83.     int 33h
  84.     pop ax
  85. endm
  86.  
  87. hide_mouse macro
  88.     push ax
  89.     mov ax,2 ; hide mouse
  90.     int 33h
  91.     pop ax
  92. endm
  93.  
  94. incz macro op  ; if Z op++
  95. local not_zero
  96. jnz short not_zero
  97. inc op
  98. not_zero:
  99. endm
  100.  
  101. movz macro reg,val1,val2 ; reg = ZF ? val1 : val2
  102. local is_zero
  103. ifnb <val1>
  104.   mov reg,val1
  105. endif
  106. jz short is_zero
  107. ifnb <val2>
  108.   mov reg,val2
  109. endif
  110. is_zero:
  111. endm
  112.  
  113. pushr macro regs   ;; eg: pushr <bx,ax,cx>
  114. local reg
  115.    irp reg,<regs>
  116.      push reg
  117.    endm
  118. endm
  119.  
  120. popr  macro regs   ;; eg: popr  <cx,ax,bx>
  121. local reg
  122.    irp reg,<regs>
  123.      pop  reg
  124.    endm
  125. endm
  126.  
  127. incr macro reg,count  ;; inc(reg,count)
  128.  rept count
  129.   inc reg
  130.  endm
  131. endm
  132.  
  133. decr macro reg,count  ;; dec(reg,count)
  134.  rept count
  135.   dec reg
  136.  endm
  137. endm
  138.  
  139.  
  140. if XT
  141.  xpusha macro
  142.         pushr <AX,BX,CX,DX,BP,SI,DI>
  143.  endm
  144.  xpopa macro
  145.         popr <DI,SI,BP,DX,CX,BX,AX>
  146.  endm
  147. else
  148.  xpusha macro
  149.         pusha
  150.  endm
  151.  xpopa macro
  152.         popa
  153.  endm
  154. endif
  155.  
  156. if XT
  157. biosdata segment at 40h
  158. org 1ah
  159. headptr dw (?)  ; pointer to next key entry to read
  160. tailptr dw (?)  ; pointer to last read key entry
  161. org 80h
  162. bufstrt dw (?)  ; pointer to start keyboard buffer
  163. bufend  dw (?)  ; pointer to end keyboard buffer
  164. biosdata ends
  165. endif ; XT
  166.  
  167.  
  168. code segment
  169. assume cs:code
  170.  
  171. res_beg equ $        ; keep resident starting from here
  172.  
  173. tick_flg db FALSE            ; stuff at timer ticks too ?
  174. left_press_flg db FALSE      ; left button is pressed
  175. select_flag db FALSE         ; there is an area marked on screen
  176. mouse_on_flg db FALSE        ; mouse is on
  177. ctrl_rt_clck_flg db FALSE    ; at the last right click ctrl was pressed, too
  178. in10_flg dw 0                ; is incremented at each call of int 10h
  179. old_mask dw 0                ; is used in Patch of Exec
  180. old_rout dw 0,0              ; also
  181. pressed_scroffs dw (?)       ; screen position at mouse click
  182. old_scroffs dw (?)           ; screen position befor last mouse movement
  183. scr_mark_mask db DEFAULT_SCR_MARK_MASK
  184. xor_ptr dw (?)               ; pointer to scren area to mark
  185. charsave db 0                ; if keyboard buffer full, save char here
  186. colsPline dw (?)             ; characters per line on screen
  187. videoseg  dw (?)             ; segment of screen memory
  188. videooffs dw (?)             ; offset of actual video page
  189. lclcktime dw 0,0             ; time since last left click
  190. buffer_valid db FALSE        ; becomes true after right click
  191. blnks_left db (?)            ; rest of actual blanc coding
  192. buf_poi dw offset rd_buffer  ; pointer to char buffer (read from there)
  193.  
  194. buf_end_poi dw offset rd_buffer
  195.  
  196. ; calculate video offset from x and y
  197. ; In:  x=cx, y=dx ; x=0.., y=0..
  198. ; Out: ax := offs = y*80+x
  199. xy2offs proc
  200.       pushr <dx,cx>
  201. if XT
  202.    rept 3
  203.      shr cx,1
  204.    endm
  205. else
  206.       shr cx,3
  207. endif
  208.       cmp colsPline,40
  209.       jnz short @@no_40
  210.       shr cx,1         ; divide by 16 if there are 40 columns per line
  211.     @@no_40:
  212. if XT
  213.    rept 3
  214.      shr dx,1
  215.    endm
  216. else
  217.       shr dx,3
  218. endif
  219.       mov ax,dx
  220.       mul colsPline
  221.       add ax,cx        ; +=x
  222.       add ax,ax        ; 2 bytes per character
  223.       add ax,videooffs
  224.       inc ax           ; -> attribute
  225.       popr <cx,dx>
  226.       ret
  227. xy2offs endp
  228.  
  229.  
  230. ; show or hide mark on screen
  231.  
  232. xor_scr proc
  233.       pushr <cx,bx,dx>
  234.       push ds
  235.       hide_mouse       ; in order not to destroy the mouse cursor
  236.       mov bx,xor_ptr
  237.       mov cl,scr_mark_mask
  238.       mov dx,videoseg
  239.       mov ds,dx
  240.       sar ax,1         ; /=2 to get number of characters
  241.       or  ax,ax
  242.       jns short @@pos_loop
  243.  
  244. ; mouse was moved to the left
  245. @@neg_loop:
  246.       xor byte ptr [ds:bx],cl   ; scr_mark_mask
  247.       sub bx,2
  248.       inc ax      ; inc, as counter is negativ
  249.       jnz short @@neg_loop
  250.       jmp short @@exit
  251. ; mouse was moved to the right
  252. @@pos_loop:
  253.       add bx,2
  254.       xor byte ptr [ds:bx],cl
  255.       dec ax
  256.       jnz short @@pos_loop
  257. @@exit:
  258.       show_mouse
  259.       pop ds
  260.       mov xor_ptr,bx
  261.       popr <dx,bx,cx>
  262.     ret
  263. xor_scr endp
  264.  
  265. ; select single word chosen by double click
  266.  
  267. select_word proc
  268.       push videoseg
  269.       pop ds
  270.       mov bx,pressed_scroffs   ; -> attribute
  271.       dec bx
  272.       call @@tst_let
  273.       jc @@exit                ; clicked to void
  274.   @@go_left:                   ; search for word begin
  275.       call @@tst_let
  276.       decr bx,2
  277.       jnc  @@go_left
  278.       add bx,5                 ; points to attribute again
  279.       mov  pressed_scroffs,bx
  280.       decr bx,2
  281.       mov  xor_ptr,bx
  282.       dec  bx
  283.   @@go_right:                  ; search for word end
  284.       incr bx,2
  285.       call @@tst_let
  286.       jnc @@go_right
  287.       mov ax,bx
  288.       inc bx
  289.       mov old_scroffs,bx
  290.       sbb ax,xor_ptr           ; cy is 1 from tst_let
  291.       call xor_scr
  292.   @@exit:
  293.       ret
  294.   @@tst_let:                   ; if [ds:bx] in {0..9,A..Z,a..z,80h..a5h,_}
  295.       mov al,[ds:bx]           ;    cy:=0
  296.       cmp al,'0'               ; else
  297.       jb @@nolet               ;    cy:=1
  298.       cmp al,'9'
  299.       jbe @@let      ; 0..9
  300.       cmp al,'A'
  301.       jb @@nolet
  302.       cmp al,'Z'
  303.       jbe @@let      ; A..Z
  304.       cmp al,'_'
  305.       jz  @@let
  306.       cmp al,'a'
  307.       jb  @@nolet
  308.       cmp al,'z'
  309.       jbe @@let      ; a..z
  310.       cmp al,80h
  311.       jb  @@nolet    ; european special characters
  312.       cmp al,0a5h
  313.       jbe @@let
  314.       cmp al,0e0h
  315.       jb  @@nolet    ; greek letters
  316.       cmp al,0ebh
  317.       ja  @@nolet
  318.   @@let:
  319.       clc
  320.       ret
  321.   @@nolet:
  322.       stc
  323.       ret
  324. select_word endp
  325. ; select screen area that was passed
  326. ; during mouse movement
  327.  
  328. scr_select proc
  329. ; In: cx,dx = mouse x,y
  330.  
  331.       call xy2offs
  332.       push ax
  333.       sub ax,old_scroffs     ; ax:= number passed positions * 2
  334.       pop old_scroffs        ; new pos to old pos
  335.       jz short @@exit        ; was moved to little to change text pos
  336.       call xor_scr
  337.       mov select_flag,TRUE
  338.     @@exit:
  339.       ret
  340. scr_select endp
  341.  
  342. ; deselect screen area that was passed
  343. ; during mouse movement
  344.  
  345. scr_un_select proc
  346.       cmp select_flag,TRUE
  347.         jnz short @@exit     ;